function gradient = expmap2rotmatGradient(expmap)

quat = expmap2quat(expmap);
qw = quat(1); qx = quat(2); qy = quat(3); qz = quat(4);

quat2expmap_grad = quat2expmapGradient(expmap);

gradient = zeros(3, 3, 3);
for i = 1:3
    prod(1) = -4*qx*quat2expmap_grad(2, i);
    prod(2) = -4*qy*quat2expmap_grad(3, i);
    prod(3) = -4*qz*quat2expmap_grad(4, i);
    prod(4) =  2*(qy*quat2expmap_grad(2, i) + qx*quat2expmap_grad(3, i));
    prod(5) =  2*(qw*quat2expmap_grad(4, i) + qz*quat2expmap_grad(1, i));
    prod(6) =  2*(qz*quat2expmap_grad(2, i) + qx*quat2expmap_grad(4, i));
    prod(7) =  2*(qw*quat2expmap_grad(3, i) + qy*quat2expmap_grad(1, i));
    prod(8) =  2*(qz*quat2expmap_grad(3, i) + qy*quat2expmap_grad(4, i));
    prod(9) =  2*(qw*quat2expmap_grad(2, i) + qx*quat2expmap_grad(1, i));

    gradient(:, :, i) = [prod(2)+prod(3) prod(4)-prod(5) prod(6)+prod(7);
                         prod(4)+prod(5) prod(1)+prod(3) prod(8)-prod(9);
                         prod(6)-prod(7) prod(8)+prod(9) prod(1)+prod(2)];
end
